#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include "include/version.h"
#include "include/boards.h"

#include <QMainWindow>
#include <QCursor>
#include <QDesktopServices>
#include <QDir>
#include <QFileDialog>
#include <QImage>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QNetworkRequest>
#include <QString>
#include <QStringList>
#include <QTextStream>
#include <QUrl>


namespace Ui {
    class MainWindow;
}



/**
  * Класс, описывающий работу приложения.
  */
class MainWindow : public QMainWindow
{


    Q_OBJECT


private:

    /**
      * Указатель на главное окно приложения.
      */
    Ui::MainWindow *ui;

    /**
      * Адрес треда.
      *
      * Объект содержит url треда, из которого требуется загрузить картинки.
      */
    QUrl url;

    /**
      * Путь для сохранения изображений.
      *
      * Полный путь к каталогу, в который требуется загружать картинки.
      * Определяется в методах initPath() и on_pathSelectButton_clicked().
      */
    QString path;

    /**
      * Список с хост-адресами поддерживаемых имиджборд.
      *
      * Список устанавливается в методе initBoards().
      * Поддреживаемые имиджборды определены в файле 'boards.h'
      */
    QStringList boardsAddress;

    /**
      * Список с адресами картинок для загрузки.
      *
      * Список заполняется в методе parseHtml().
      */
    QStringList imgList;

    /**
      * Текущая имиджборда.
      *
      * Имиджборда, которой принадлежит тред, интересуемый пользователя.
      * Определяется в методе testUrl().
      */
    int board;

    /**
      * Порядковый номер загружаемого изображения.
      */
    int currentImage;

    int minFSize;
    int maxFSize;
    int minImSizeW, minImSizeH;
    int maxImSizeW, maxImSizeH;


public:

    /**
      * Конструктор.
      * Инициализация адресов имиджборд, пути загрузки и пр.
      */
    explicit MainWindow(QWidget *parent = 0);

    /**
      * Деструктор.
      *
      * Удаление визуализированной ранее формы.
      */
    ~MainWindow();


private slots:

    void on_lineEdit_thread_returnPressed();
    void on_lineEdit_thread_textChanged(QString );

    void on_checkBox_maxImSize_stateChanged(int );
    void on_checkBox_minImSize_stateChanged(int );
    void on_checkBox_maxFSize_stateChanged(int );
    void on_checkBox_minFSize_stateChanged(int );

    void on_toolButton_test_clicked();
    void on_pathSelectButton_clicked();
    void on_launchButton_clicked();


private slots:

    /**
      * Установка реакции на определенный события.
      *
      * Определяется реакция на нажатие на label_url.
      */
    bool eventFilter(QObject *obj, QEvent *event);

    /**
      * Вывод на вкладку 'About' основной формы текущей версии программы и дополнительных данных.
      */
    void setVersions();

    /**
      * Инициализация адресов поддерживаемых имиджборд
      */
    void initBoards();

    /**
      * Определение стандартного пути для загрузки.
      */
    void initPath();

    /**
      * Вывод текстового сообщения в строку состояния.
      *
      * @param str Константный указатель на ascii-строку.
      */
    void showMessage(const char* str);

    /**
      * Вывод в строку сотояния порядкового номера загружаемого изображения.
      *
      * @param a Текущее загружаемая картинка.
      * @param all Общее количество картинок для загрузки.
      */
    void showImgMessage(int a, int all);

    /**
      * Проверка "валидности" адреса треда.
      *
      * @return Результат проверки (true | false).
      */
    bool testURL();

    /**
      * Чтение параметров загрузки из настроек на форме.
      */
    void readParametrs();

    /**
      * Создание директории для загрузки картинок.
      *
      * Путь загрузки содердится в поле path.
      * @return Результат создания директории  (true | false)..
      */
    bool createDirectory();

    /**
      * Загрузка непосредственно html-файла треда.
      *
      * @return Результат начала загрузки треда (true | false).
      */
    bool startDownloading();

    /**
      * Обработка сигнала о конце загрузки html-файла треда. Вызов этого метода происходит автоматически.
      *
      * В случае успешной загрузки треда вызов parseHtm().
      * @param reply Указатель QnetworkReply - ответ на запрос, посылаемый в методе startDownloading().
      */
    void QnamFinished(QNetworkReply* reply);

    /**
      * Выделение из треда url картинок.
      *
      * @param reply Ответ на запрос о загрузке треда.
      * @return Результат анализа треда  (true | false).
      */
    bool parseHtml (QNetworkReply* reply);

    /**
      * Определение типа доски имиджборды.
      *
      * К примеру, для треда 'http://2ch.so/b/res/1222453.html' тип доски будет 'b'.
      * @param rvalue Строка для записи типа доски.
      * @return Результат анализа url треда (true | false).
      */
    bool getBoardType(QString& rvalue);

    /**
      * Начало загрузки картинок из треда.
      *
      * Значение currentImage становится 0.
      * Происходит вывод соответствуещего сообщения ч\з showImgMessage() и первый вызов getNextImage().
      * @return Результат начала загрузки  (true | false).
      */
    bool downloadImages();

    /**
      * Начало загрузка следующей картинки.
      */
    void getNextImage();

    /**
      * Обработка сигнала о загрузке одной картинки.
      */
    void getImageFinished(QNetworkReply*);

    /**
      * Перевод GUI в состояние 'занятости'.
      *
      * Установка real_only для lineEdit_thread, курсор над основной формой переводится в состояние busy.
      * @param par Настройка состояния (true для on, false для off).
      */
    void setBusy(bool par);


};

#endif // MAINWINDOW_H
